package generador;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Arbol {
	private String tipo;
	private String valor;
	private List<Arbol> hijos;

	private Integer idSimbolo;
	private Arbol padre;

	public Arbol(String tipo) {
		this.tipo = tipo;
		this.valor = null;
		this.idSimbolo = null;
		this.hijos = new ArrayList<Arbol>();

	}

	public Arbol(String tipo, String valor) {
		this.tipo = tipo;
		this.valor = valor;
		this.idSimbolo = null;
		this.hijos = new ArrayList<Arbol>();

	}

	public Arbol(String tipo, String valor, Integer id) {
		this.tipo = tipo;
		this.valor = valor;
		this.idSimbolo = id;
		this.hijos = new ArrayList<Arbol>();

	}

	public Integer getIdSimbolo() {
		return idSimbolo;
	}

	public void setIdSimbolo(Integer idSimbolo) {
		this.idSimbolo = idSimbolo;
	}

	public List<Arbol> getHijos() {
		return hijos;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public String getTipo() {
		return this.tipo;
	}

	public void setValor(String valor) {
		this.valor = valor;
	}

	public String getValor() {
		return valor;
	}

	public void agregarHijo(Arbol hijo) {
		this.hijos.add(hijo);
		hijo.setPadre(this);
	}
	
	public void agregarPrimerHijo(Arbol hijo)
	{
		this.hijos.add(0, hijo);
		hijo.setPadre(this);
	}

	public Arbol buscarArbol(String tipo) {
		Iterator<Arbol> it = hijos.iterator();
		Arbol arbol = null;
		while (it.hasNext()) {
			arbol = it.next();
			if (arbol.getTipo().equals(tipo)) {
				return arbol;
			}
		}
		return null;
	}

	public Arbol buscarArbolHijo(String tipo) {
		Iterator<Arbol> it = hijos.iterator();
		Arbol arbol = null;
		while (it.hasNext()) {
			arbol = it.next();
			Iterator<Arbol> itHijo = arbol.hijos.iterator();
			Arbol hijo = null;
			while (itHijo.hasNext()) {
				hijo = itHijo.next();
				if (hijo.getTipo().equals(tipo)) {
					return arbol;
				}
			}
		}
		return null;
	}

	public void recorrer(Arbol arbol, int nivel) {
		String tabs = "";
		for (int i = 0; i < nivel; i++) {
			tabs = tabs.concat("  ");
		}

		System.out.println(String.format("%s%s", tabs, arbol.tipo));
		Iterator<Arbol> it = arbol.hijos.iterator();
		Arbol hijo = null;
		while (it.hasNext()) {
			hijo = it.next();
			recorrer(hijo, nivel + 1);
		}
	}

	public Arbol getPadre() {
		return padre;
	}

	public void setPadre(Arbol padre) {
		this.padre = padre;
	}
}
